package com.xiaobawang.knowledge.spider.model.dto;

import com.github.pagehelper.PageInfo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

/**
 * @description 分页查询的响应结构
 * @author 18101119
 * @date 2024/10/17 9:26
 * @email songxinhang2023@e-chinalife.com
 * @id 18101119
 * @phone 13001321080
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PageQueryDTO<T> {
    private List<T> items;            // 查询结果列表
    private int pageNumber;           // 当前页码
    private int pageSize;             // 每页显示的数量
    private long total;               // 总记录数
    private int pages;                // 总页数
    private boolean hasNextPage;      // 是否有下一页
    private boolean hasPreviousPage;  // 是否有上一页
    private int prePage;              // 上一页页码
    private int nextPage;             // 下一页页码
    private boolean isFirstPage;      // 是否是第一页
    private boolean isLastPage;       // 是否是最后一页
    private int size;                 // 当前页的实际记录数
    private long startRow;            // 当前页第一条记录的位置
    private long endRow;              // 当前页最后一条记录的位置

    public static <T> PageQueryDTO<T> build(PageInfo<T> pageInfo) {
        return PageQueryDTO.<T>builder()
                .items(pageInfo.getList())
                .pageNumber(pageInfo.getPageNum())
                .pageSize(pageInfo.getPageSize())
                .pages(pageInfo.getPages())
                .total(pageInfo.getTotal())
                .hasNextPage(pageInfo.isHasNextPage())
                .hasPreviousPage(pageInfo.isHasPreviousPage())
                .prePage(pageInfo.getPrePage())
                .nextPage(pageInfo.getNextPage())
                .isFirstPage(pageInfo.isIsFirstPage())
                .isLastPage(pageInfo.isIsLastPage())
                .size(pageInfo.getSize())
                .startRow(pageInfo.getStartRow())
                .endRow(pageInfo.getEndRow())
                .build();
    }

    public static <T, U> PageQueryDTO<U> buildWithItems(PageInfo<T> pageInfo, List<U> items) {
        return PageQueryDTO.<U>builder()
                .items(items)
                .pageNumber(pageInfo.getPageNum())
                .pageSize(pageInfo.getPageSize())
                .pages(pageInfo.getPages())
                .total(pageInfo.getTotal())
                .hasNextPage(pageInfo.isHasNextPage())
                .hasPreviousPage(pageInfo.isHasPreviousPage())
                .prePage(pageInfo.getPrePage())
                .nextPage(pageInfo.getNextPage())
                .isFirstPage(pageInfo.isIsFirstPage())
                .isLastPage(pageInfo.isIsLastPage())
                .size(pageInfo.getSize())
                .startRow(pageInfo.getStartRow())
                .endRow(pageInfo.getEndRow())
                .build();
    }
}